package com.bestcem.xm.user.service.init;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.service.dto.init.InitOrgRequestDTO;
import com.bestcem.xm.user.service.dto.role.UserRoleDTO;
import com.bestcem.xm.user.service.dto.user.OrganizationDTO;
import com.bestcem.xm.user.service.dto.user.UserMfaSettingDTO;

/**
 * 用户中心初始化服务
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/18 18:36
 */
public interface UserInitService {

    /**
     * 初始化系统管理员角色以及角色权限
     *
     * @param orgId
     * @return ServiceResult<UserRoleDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/18 18:44
     */
    ServiceResult<UserRoleDTO> initAdminRoleAndPerms(String orgId);

    /**
     * 初始化高级管理员角色以及角色权限
     *
     * @param orgId
     * @return ServiceResult<UserRoleDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/18 18:45
     */
    ServiceResult<UserRoleDTO> initSeniorAdminRoleAndPerms(String orgId);

    /**
     * 通过角色名称重置角色权限
     *
     * @param roleName
     * @return ServiceResult<Void>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/18 18:48
     */
    ServiceResult<Void> resetRolePerms(String roleName);

    /**
     * 初始化租户安全验证信息
     *
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/10 17:28
     */
    ServiceResult<UserMfaSettingDTO> initOrgMfaSetting();

    /**
     * 重置用户密码
     *
     * @param orgCode  公司code
     * @param userName 用户账号
     * @param password 用户密码
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/23 21:10
     */
    ServiceResult<Void> resetUserPwd(String orgCode, String userName, String password);

    /**
     * 更新系统管理员和高级管理员的权限
     *
     * @return ServiceResult<Void>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/18 18:50
     */
    ServiceResult<Void> updateAdminAndSeniorRolePerms();

    /**
     * 初始化短信模版和计算字段(与公司相关)
     *
     * @param orgId 公司Id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/21 19:02
     */
    ServiceResult<Void> initOrganizationAsyncTask(String orgId);

    /**
     * 删除验证失败的smtp邮箱
     *
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/21 18:25
     */
    ServiceResult<Void> delValidateFailSmtp();

    /**
     * 扫描全部公司，给每个公司添加系统邮箱，
     * 同时把系统邮箱设置为默认的审核邮件的发件箱
     *
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Void>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/21 18:25
     */
    ServiceResult<Void> addSystemSmtp();


    /**
     * 初始化免费版和商业版公司参数
     *
     * @param
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/10 18:10
     */
    ServiceResult<Boolean> initFreeOrganization();

    //初始化插入默认模板
    void initDefaultTemplate(String orgId);

    /**
     * 更新用户同意协议和是否内部员工
     *
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/3/1 17:11
     */
    ServiceResult<Boolean> updateAcceptAndInnerUser();

    /**
     * 初始化公司
     *
     * @param initOrgRequestDTO
     * @return ServiceResult<OrganizationDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/21 16:20
     */
    ServiceResult<OrganizationDTO> initOrganization(InitOrgRequestDTO initOrgRequestDTO);

    /**
     * 将原有的expireDT刷入free_expireDT字段,如果free_expireDT已存在则不刷新
     *
     * @param
     * @return ServiceResult<Void>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/21 16:51
     */
    ServiceResult<Void> transExpireDtToFreeExpireDt();

    /**
     * 已有项目设置默认不露出品牌
     *
     * @param
     * @return ServiceResult<Void>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/21 16:55
     */
    ServiceResult<Boolean> setBrand();

    /**
     * 内部公司的全部用户设置为内部用户
     *
     * @param
     * @return ServiceResult<Void>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/21 16:55
     */
    ServiceResult<Void> setOrgInner();

    /**
     * 手动创建公司
     *
     * @param
     * @return ServiceResult<Void>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @author yun.pan <yun.pan@idiaoyan.cn>
     * @date 2022/3/21 16:55
     */
    ServiceResult<Void> manuallyInitOrg(String manuallyOrgCode, String manuallyOrgName);

    /**
     * 初始化系统管理员用户
     *
     * @param roleDTO 角色(系统管理员)
     * @param orgId   公司
     * @return ServiceResult<Void>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/5/26 10:39
     */
    ServiceResult<Void> initAdminUser(UserRoleDTO roleDTO, String orgId);

    /**
     * user_group表seq字段与redis不一致问题刷数据
     *
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/19 20:02
     */
    void seqSynchronize();

    /**
     * 私有化部署初始化钱包
     *
     * @param orgCode 租户code
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/8/1 14:52
     */
    void createCorporateWallet(String orgCode);
}
